# 读取yaml文件数据
import copy
import os
import uuid

import yaml

from core.global_text import g_varial
from examples.generatestr import generate_unique_str


def read_my_yaml(filename):
    with open(filename,"r",encoding="utf-8") as f:
        data = yaml.full_load(f)
        return data
    # 再封装一个方法，把上面读取的yaml转成嵌套在列表里
def readYamlAsList(filename):
    case_list = []
    case_info = read_my_yaml(filename)
    case_list.append(case_info)
    return case_list

# 读取context.yaml里面的数据，存放到全局变量里面
def read_context_put_global(folder_path):
    yaml_path = os.path.join(folder_path,"context.yaml")
    yaml_data = read_my_yaml(yaml_path)
    g_varial().set_by_dict(yaml_data)
    g_varial().set_dict("account",generate_unique_str())
    return g_varial().show_dic()

# 想要执行多个yaml文件,需要按照我的规则运行
# 规则 必须以.yaml结尾，第一个是数字用_分割
# 传目录

# 目的：yaml规则按照我们的想法去运行所有的yaml用例
# 多个yaml文件数据挨个读取出来放在列表中
def load_yaml_files(folder_path):
    file_names = []
    yaml_case_infos = []
    read_context_put_global(folder_path)
    # 拿到目录中的所有文件和子文件
    allfiles = os.listdir(folder_path)
    for f in allfiles:
        # 规则 必须以.yaml结尾，第一个是数字用_分割
        if f.endswith(".yaml") and f.split("_")[0].isdigit():
            file_num = int(f.split("_")[0])
            file_names.append((file_num,f))# (1,01_login.yaml),(2,02_add.yaml)
    # 从小到大排序
    file_names.sort()
    # 只想拿到第二个元素 01_xxx.yaml。用列表推导式获取
    file_names = [f[1] for f in file_names] # [01_login.yaml,02_add.yaml]

    # 挨个读取文件的用例数据
    for file_name in file_names:
        # 拼接yaml文件路径
        file_path = os.path.join(folder_path,file_name)
        # 读取yaml文件数据
        case_info = read_my_yaml(file_path)
        # print("读取每个yaml文件数据",case_info)
        # 把数据放在列表中
        yaml_case_infos.append(case_info)
    return yaml_case_infos

# 统一后续yaml/excel的数据格式
def yaml_case_parser(folder_path):
    case_infos = []
    case_names = []
    yaml_caseinfos = load_yaml_files(folder_path)
    for caseinfo in yaml_caseinfos:
        # 可以拿到ddts列表,处理成一个登录用例一个数据  处理ddts的数据 循环数据组合新的用例
        ddts = caseinfo.get("ddts",[]) # 先获得ddts
        # 如果长度>0的时候，当前用例中的ddts将被删掉
        if len(ddts)>0:
            caseinfo.pop("ddts") # 当前测试用例中的ddts删除掉
        if len(ddts) == 0:
            case_name = caseinfo.get("desc",uuid.uuid4().__str__())
            caseinfo.update({"_case_name":case_name})
            case_infos.append(caseinfo)
            case_names.append(case_name)
        else:
            for ddt in ddts:
                new_case = copy.deepcopy(caseinfo)
                context = new_case.get("context",{})
                ddt.update(context)
                new_case.update({"context":ddt})

                # 收集用例标题
                case_name = f'{caseinfo.get("desc",uuid.uuid4().__str__())}-{ddt.get("desc",uuid.uuid4().__str__())}'
                new_case.update({"_case_name":case_name})

                case_infos.append(new_case)
                case_names.append(case_name)
    return {
        "case_name":case_names,
        "case_info":case_infos
    }


